#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"

/* Uncomment one of the lines below for whatever DHT sensor type you're using! */
#define DHT_TYPE DHT11  // DHT 11
//#define DHT_TYPE DHT21  // DHT 21 (AM2301)
//#define DHT_TYPE DHT22  // DHT 22  (AM2302), AM2321

/* DHT Sensor */
#define DHT_PIN D8

/* Put SSID & Password. */
const char* ssid = "YXS1302";  // Enter SSID here
const char* password = "YuanXueShe1302";  //Enter Password here

ESP8266WebServer server(80);
               
/* Initialize DHT sensor. */
DHT dht(DHT_PIN, DHT_TYPE);                

float Temperature;
float Humidity;
 
void setup()
{
    Serial.begin(115200);
    delay(100);
    
    pinMode(DHT_PIN, INPUT);

    dht.begin();              

    /* Connect to the WiFi network. */
    Serial.println("");
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected.");

    /* Output of the IP address. */
    Serial.print("Use this URL to connect: ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");

    server.on("/", handle_OnConnect);
    server.onNotFound(handle_NotFound);

    server.begin();
    Serial.println("HTTP server started!");
}
void loop()
{
    server.handleClient();
}

void handle_OnConnect()
{
    Temperature = dht.readTemperature(); // Gets the values of the temperature
    Humidity = dht.readHumidity(); // Gets the values of the humidity
    server.send(200, "text/html", SendHTML(Temperature,Humidity));
}

void handle_NotFound()
{
    server.send(404, "text/plain", "Not found");
}

//String SendHTML(float TempCstat, float TempFstat, float Humiditystat)
String SendHTML(float TempCstat, float Humiditystat)
{
    char tempStr[5];
    String ptr = "<!DOCTYPE html> <html>\n";
    ptr += "<meta http-equiv=\"refresh\" content=\"2\" >";
    ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
    ptr += "<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
    ptr += "<title>ESP8266 Weather Report</title>\n";
    ptr += "<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n";
    ptr += "body{margin-top: 50px;}\n";
    ptr += "h1 {margin: 50px auto 30px;}\n";
    ptr += ".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n";

    ptr += ".humidity-icon{background-color: #3498db;width: 30px;height: 30px;border-radius: 50%;line-height: 36px;}\n";
    ptr += ".humidity-text{font-weight: 1000;padding-left: 10px;font-size: 24px;width: 180px;text-align: left;}\n";
    ptr += ".humidity{font-weight: 600;font-size: 30px;color: #3498db;}\n";

    ptr += ".temperature-icon{background-color: #f39c12;width: 30px;height: 30px;border-radius: 50%;line-height: 40px;}\n";
    ptr += ".temperature-text{font-weight: 1000;padding-left: 10px;font-size: 24px;width: 180px;text-align: left;}\n";
    ptr += ".temperature{font-weight: 600;font-size: 30px;color: #f39c12;}\n";

    ptr += ".superscript{font-size: 20px;font-weight: 600;position: absolute;right: -25px;top: 12px;}\n";
    ptr += ".data{padding: 10px;}\n";
    ptr += "</style>\n";
    ptr += "</head>\n";
    ptr += "<body>\n";

    ptr += "<div id=\"webpage\">\n";
    
    ptr += "<h1>ESP8266 Weather Report</h1>\n";
    ptr += "<div class=\"data\">\n";
    ptr += "<div class=\"side-by-side temperature-icon\">\n";
    ptr += "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
    ptr += "width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n";
    ptr += "<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n";
    ptr += "c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n";
    ptr += "c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n";
    ptr += "c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n";
    ptr += "c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n";
    ptr += "</svg>\n";
    ptr += "</div>\n";
    ptr += "<div class=\"side-by-side temperature-text\">Temperature</div>\n";
    ptr += "<div class=\"side-by-side temperature\">";
    dtostrf(TempCstat, 4, 1, tempStr);
    ptr += tempStr;
    ptr += "<span class=\"superscript\">";
    ptr += (char)176;
    ptr += "C</span></div>\n";
    ptr += "</div>\n";
    ptr += "<div class=\"data\">\n";
    ptr += "<div class=\"side-by-side humidity-icon\">\n";
    ptr += "<svg version=\"1.1\" id=\"Layer_2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\"; width=\"12px\" height=\"17.955px\" viewBox=\"0 0 13 17.955\" enable-background=\"new 0 0 13 17.955\" xml:space=\"preserve\">\n";
    ptr += "<path fill=\"#FFFFFF\" d=\"M1.819,6.217C3.139,4.064,6.5,0,6.5,0s3.363,4.064,4.681,6.217c1.793,2.926,2.133,5.05,1.571,7.057\n";
    ptr += "c-0.438,1.574-2.264,4.681-6.252,4.681c-3.988,0-5.813-3.107-6.252-4.681C-0.313,11.267,0.026,9.143,1.819,6.217\"></path>\n";
    ptr += "</svg>\n";
    ptr += "</div>\n";
    ptr += "<div class=\"side-by-side humidity-text\">Humidity</div>\n";
    ptr += "<div class=\"side-by-side humidity\">";
    dtostrf(Humiditystat, 4, 1, tempStr);
    ptr += tempStr;
    ptr += "<span class=\"superscript\">%</span></div>\n";
    ptr += "</div>\n";

    ptr += "<style>\n";
    ptr += "body {margin-top: 15%;}\n";
    ptr += ".footer-text { font-size: 30px; }";
    ptr += ".bold-text { font-weight: bold; }";
    ptr += "</style>\n";

    ptr += "<div class='footer'>";
    ptr += "<p class='footer-text'>This software was written by <span class='bold-text'>Grayson Zheng</span>.</p>";
    ptr += "</div>\n";

    ptr += "</div>\n";
    ptr += "</body>\n";
    ptr += "</html>\n";

    return ptr;
}
